package controler;

import java.beans.IntrospectionException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import rmi.Connection;
import rmi.Me;
import view.MainWindow;
import view.MultipleStringDialog;
import view.MultipleStringDialog.ExitOption;

/**
 * @author REMY Timothée and CARTIER Arthur
 * 
 */
public class Launcher {

	/**
	 * @param args
	 */
	@SuppressWarnings("unused")
	public static void main(final String[] args) {
		Me me = null;

		final JFileChooser jfc = new JFileChooser("~");

		jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
		jfc.setDialogTitle("Chose your backup file or click cancel to create a new account");
		while (me == null) {
			final int result = jfc.showOpenDialog(null);
			if (result == JFileChooser.CANCEL_OPTION) {
				final String labels[] = { "Pseudo", "IP", "Port" };

				final MultipleStringDialog msd = new MultipleStringDialog(
						null,
						"Nouveau Compte",
						true,
						labels,
						"Entrez votre pseudo et si vous les\nconnaissez votre adresse IP\net un port disponnible");

				msd.setVisible(true);
				if (msd.getExitOption() != ExitOption.VALID) {
					System.exit(0);
				}
				final String results[] = msd.getResults();
				if (results[0] != null && results[0].length() > 0) {
					try {
						me = new Me(results[0], results[1],
								Integer.parseInt(results[2]));
					} catch (final NumberFormatException e) {
						JOptionPane
								.showMessageDialog(null,
										"Le port n'est pas un nombre, veuillez recommencer");
						me = null;
					} catch (final RemoteException e) {
						JOptionPane
								.showMessageDialog(null,
										"Le registry n'as pu être initialisé, veuillez recommencer");
						me = null;
					}
				}
			} else {
				// tentative de parsing
				try {
					me = xmlReadWrite.restoreMe(jfc.getSelectedFile()
							.getCanonicalPath());
					me._setSaveMeFile(jfc.getSelectedFile().getCanonicalPath());
				} catch (final FileNotFoundException e) {
					JOptionPane
							.showMessageDialog(null,
									"Le fichier n'a pas été trouvé, veuillez selectionner un autre fichier");
				} catch (final IntrospectionException e) {
					JOptionPane
							.showMessageDialog(
									null,
									"Le fichier ne correspond pas à un fichier de sauvegarde, veuillez selectionner un autre fichier");
				} catch (final IOException e) {
					JOptionPane
							.showMessageDialog(null,
									"Le fichier n'a pas pu être lu, veuillez selectionner un autre fichier");

				}
			}
		}

		// Création du registry et bind le connect Object
		Registry r;
		Connection connection;
		try {
			r = LocateRegistry.createRegistry(me.getPort());
			connection = new Connection(me.getPort(), r, me);
			Naming.rebind("rmi://" + me.getIp() + ":" + me.getPort()
					+ "/connect", connection);

			me._setConnection(connection);
		} catch (final RemoteException e) {
			JOptionPane
					.showMessageDialog(
							null,
							"Une erreure a empéché l'ouverture du port vos amis ne pourrons pas vous contacter");

		} catch (final MalformedURLException e) {
			JOptionPane
					.showMessageDialog(
							null,
							"Une erreure a empéché votre enregistrement sur le réseau vos amis ne pourrons pas vous contacter");

		}

		me.connectAllDisconnectedFriends();

		final MainWindow mw = new MainWindow(me);
	}
}
